/////precompiled////////
#include "precompiled.h"
////////////////////////


#include "prs_FrmGeomDirect.h"
#include "prs_FrmDefTemplate.h"
using namespace prs;

// TNodeGeomDirect ////////////////////////////////////////////////////////////

// TRuleFrmGeomDirect /////////////////////////////////////////////////////////

//
TRuleFrmGeomDirect::TType TRuleFrmGeomDirect::Type;
TNodeFrmGeomDirectVert TRuleFrmGeomDirect::Vert; 
TNodeFrmGeomDirectHorz TRuleFrmGeomDirect::Horz; 

//
TRuleFrmGeomDirect::TRuleFrmGeomDirect(
  snt::text::TContext &SntContext
) 
{
  attr = NULL;
  vEnSetParamAsIdent = true;
  
  snt::TReturn Return;
  snt::TFVoid F;
  snt::text::TIdent I(SntContext);
  snt::text::TSequence T(SntContext);
  snt::text::TEnumSet EnumSet(SntContext);

  RDirect
  | F.New(this,&TRuleFrmGeomDirect::FEnableSetParamAsIdent)
    & T.New("direct") & T.New("=") 
    & RValue.New() 
    & Return.New()
  ;  

  RValue.Local(vEnSetParamAsIdent)
  | EnumSet.New(this,&TRuleFrmGeomDirect::FGetEnumDirect)
    .SetDoEntry(this,&TRuleFrmGeomDirect::FSetEnumDirect)
    & Return.New()
  | I.NewClosure(this,&TRuleFrmGeomDirect::FSetParamAsIdent).SetEnable(vEnSetParamAsIdent)
    & Return.New()
  ;
}

//
void TRuleFrmGeomDirect::FGetEnumDirect(snt::text::TEnumSet::TFuncGetEnumSetParams &Params)
{
  Params.OutEnumSet = &Type;
}

//
bool TRuleFrmGeomDirect::FSetEnumDirect(snt::text::TEnumSet::TFuncDoEntryParams &Params)
{
  TNodeFrmGeomDirect::EType EType = (TNodeFrmGeomDirect::EType)Type.Get(Params.Token.GetNValue()).I;
  TNodeFrmGeomDirect *geomDirect;

  switch (EType) {
    case TNodeFrmGeomDirect::EType_Vert:
      geomDirect = &Vert;
    break;

    case TNodeFrmGeomDirect::EType_Horz:
      geomDirect = &Horz;
    break;
    
    default: Except("FSetEnumDirect[default]");
  }

  attr->SetValueAsPointer( TNode::newCopyFrom(geomDirect) );
  return true;
}

//
void TRuleFrmGeomDirect::FEnableSetParamAsIdent(snt::TParams &Params)
{
  EnableSetParamAsIdent(true);
}

//
bool TRuleFrmGeomDirect::FSetParamAsIdent(snt::text::TIdent::TFuncClosureDoEntryParams &Params)
{
  svl::TString Id = Params.Ident.GetValue().String();
  return TNodeDefTemplate::AddLinkAttrByParamId(attr,TFrmGeomDirectValue(),Id,Params.OutError);
}
